(PYTHON) Day - 11 Sets(3)

Reference

  • 문제 출처 - HackerRank
  • 파이썬 연습 - Practice - Python

개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
문제를 풀고 Discussion Tab을 참고하며 코드 스타일을 개선하려고 노력하고자 합니다


HackerRank


Sets


기본 개념

MUTATIONS
집합의 변환(mutation)은 update() 함수가 기본이고,
intersection_update(), difference_update(), symmetric_difference_update() 기능도 제공함
각 함수는 기호로도 표현 가능하다

  • update() : |=
  • intersection_update() : &=
  • difference_update() : -=
  • symmetric_difference_update() : ^=

대표로 update() 함수의 예제만 살펴보겠다


> > > H = set("Hacker")
> > > R = set("Rank")
> > > H.update(R)
> > > print(H)
> > > set(['a', 'c', 'e', 'H', 'k', 'n', 'r', 'R'])

> > > A = set("Hacker")
> > > B = set("Rank")
> > > A |= B
> > > print(A)
> > > set(['a', 'c', 'e', 'H', 'k', 'n', 'r', 'R'])

Set Mutations


문제 : 집합 A가 있을 때, N번의 변환을 거쳐서 최종 집합 A를 구하는 문제
입력 : 집합 A의 크기; 집합 A의 원소들; 변환 횟수 N; (2*N번 반복)operation 이름과 집합 n의 원소 수;
출력 : 최종 집합 A 원소들의 합

16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 24 52
4
intersection_update 10
2 3 5 6 8 9 1 4 7 11
update 2
55 66
symmetric_difference_update 5
22 7 35 62 58
difference_update 7
11 22 35 55 58 62 66

38

eval() 함수를 사용한 방법

if **name** == '**main**':
A = int(input())
set_A = set(input().split())
N = int(input())

for _ in range(N):
operation, n = input().split()
set_n = input().split()
eval('set_A.{}({})'.format(operation, set_n))

print(sum([int(i) for i in set_A]))

getattr() 함수를 사용한 방법, 입력 받을 때 tuple 형식으로 받는 것도 인상적

if **name** == '**main**':
(_, A) = (int(input()),set(map(int, input().split())))
B = int(input())
for _ in range(B):
(command, newSet) = (input().split()[0],set(map(int, input().split())))
getattr(A, command)(newSet)

print (sum(A))

The Captain’s Room


문제 : 호텔의 방문객으로 몇몇 그룹의 관광객들과 캡틴(captain) 한명이 있을 때, 캡틴이 누구인지 찾는 문제
입력 : 관광객 그룹의 크기 K; 각 관광객들의 방 번호;
출력 : 캡틴의 방 번호

5
1 2 3 6 5 4 4 2 5 3 6 1 6 5 3 2 4 1 2 5 1 4 3 6 8 4 3 1 5 6 2

8

collections 모듈에서 .Counter() 함수를 사용해봤다

import collections

if **name** == '**main**':
K = int(input())
room_no = [e for e in input().split()]
s = collections.Counter(room_no)

print(*[k for k, v in s.items() if v==1])

수학적으로 계산한 방법
예제의 경우 대충 (8+8+8+8)//4 요론 느낌? 짧아서 읽으면 이해가 된다

k,arr = int(input()),list(map(int, input().split()))
myset = set(arr)

print(((sum(myset)\*k)-(sum(arr)))//(k-1))

Check Subset


문제 : 집합 A, B가 주어졌을 때 A가 B의 부분집합인지 확인하는 문제
입력 : 테스트케이스 수 T; {(T번 반복) 집합A 원소 수; 집합A의 원소들; 집합B 원소 수; 집합B의 원소들;}
출력 : True/False로 출력

3
5
1 2 3 5 6
9
9 8 5 6 3 2 1 4 7
1
2
5
3 6 5 4 1
7
1 2 3 5 6 8 9
3
9 8 2

True
False
False

if **name** == '**main**':

for \_ in range(int(input())):
nA = input()
set_A = {n for n in input().split()}
nB = input()
set_B = {n for n in input().split()}

print(set_A.issubset(set_B))

Check Strict Superset


문제 : n개의 집합들이 집합 A의 진부분 집합인지 확인하는 문제
입력 : 집합 A의 원소들; 비교할 집합의 수 n; (n번 반복) 비교할 집합의 원소들;
출력 : True/False로 출력
예제 : {1 2 3 4 5}는 진부분 집합이 맞지만 {100 11 12}는 아니므로 답은 False

1 2 3 4 5 6 7 8 9 10 11 12 23 45 84 78
2
1 2 3 4 5
100 11 12

False

if **name** == '**main**':
set_A = {n for n in input().split()}
ans = True

for _ in range(int(input())):
other = {n for n in input().split()}
if not other.issubset(set_A):
ans = False

print(ans)
  • 2줄만에 끝내다니…
a = set(input().split())
print(all(a > set(input().split()) for \_ in range(int(input()))))